import axios from 'axios';

// 创建axios实例
const service = axios.create({
  baseURL: ' http://localhost:3000/api',
  timeout: 5000
});

// 存储请求队列，用于token过期时重试
let requestQueue = [];
// 是否正在刷新token
let isRefreshing = false;

// 更新队列长度的函数
const updateQueueLength = () => {
  if (window.updateQueueLength) {
    window.updateQueueLength(requestQueue.length);
  }
};

// 请求拦截器
service.interceptors.request.use(
  config => {
    // 获取token
    const token = localStorage.getItem('token');
    if (token) {
      config.headers['Authorization'] = `Bearer ${token}`;
    }
    return config;
  },
  error => {
    return Promise.reject(error);
  }
);

// 响应拦截器
service.interceptors.response.use(
  response => {
    return response.data;
  },
  async error => {
    const { config, response } = error;

    // 处理token过期的情况
    if (response && response.status === 401 && response.data.message === 'token已过期') {
      // 如果请求已经重试过，则直接返回错误
      if (config._retry) {
        return Promise.reject(error);
      }

      // 如果正在刷新token，则将请求加入队列
      if (isRefreshing) {
        return new Promise(resolve => {
          requestQueue.push(() => {
            resolve(service(config));
          });
          // 更新队列长度
          updateQueueLength();
        });
      }

      // 标记为已重试
      config._retry = true;
      // 标记正在刷新token
      isRefreshing = true;

      try {
        // 调用刷新token的接口
        const refreshToken = localStorage.getItem('refreshToken');
        const res = await service.post('/refresh', { refreshToken });
        const { token: newToken, refreshToken: newRefreshToken } = res;

        // 更新本地存储的token
        localStorage.setItem('token', newToken);
        localStorage.setItem('refreshToken', newRefreshToken);

        // 重试队列中的请求
        requestQueue.forEach(cb => cb());
        // 清空队列
        requestQueue = [];
        // 更新队列长度
        updateQueueLength();

        // 重试当前请求
        return service(config);
      } catch (err) {
        // 刷新token失败，跳转到登录页
        localStorage.removeItem('token');
        localStorage.removeItem('refreshToken');
        window.location.href = '/login';
        return Promise.reject(err);
      } finally {
        // 重置刷新状态
        isRefreshing = false;
      }
    }

    // 处理其他错误情况的重试逻辑
    // 这里可以根据需要添加其他状态码的处理
    if (response && [500, 502, 503, 504].includes(response.status)) {
      // 如果没有设置重试次数，默认为3次
      const retryCount = config.retryCount || 0;
      if (retryCount < 3) {
        config.retryCount = retryCount + 1;
        // 指数退避重试策略
        const delay = Math.pow(2, retryCount) * 1000;
        return new Promise(resolve => {
          setTimeout(() => {
            resolve(service(config));
          }, delay);
        });
      }
    }

    return Promise.reject(error);
  }
);

export default service;